#ifndef ALARMMODEL_H
#define ALARMMODEL_H

#include <QAbstractListModel>
#include <QVector>
#include "../core/alarmengine.h"

/**
 * @brief 报警数据模型类
 * 用于在QML中显示报警列表
 * 支持过滤、排序等功能
 */
class AlarmModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
    Q_PROPERTY(FilterMode filterMode READ filterMode WRITE setFilterMode NOTIFY filterModeChanged)
    Q_PROPERTY(bool showActiveOnly READ showActiveOnly WRITE setShowActiveOnly NOTIFY showActiveOnlyChanged)

public:
    /**
     * @brief 数据角色枚举
     */
    enum AlarmRoles
    {
        AlarmIdRole = Qt::UserRole + 1, ///< 报警ID
        MeterIdRole,                    ///< 电表ID
        MeterNameRole,                  ///< 电表名称
        AlarmTypeRole,                  ///< 报警类型（枚举）
        TypeNameRole,                   ///< 报警类型名称
        ValueRole,                      ///< 当前值
        ThresholdRole,                  ///< 阈值
        TimestampRole,                  ///< 报警时间
        ActiveRole,                     ///< 是否激活
        AcknowledgedRole,               ///< 是否已确认
        DescriptionRole                 ///< 报警描述
    };
    Q_ENUM(AlarmRoles)

    /**
     * @brief 过滤模式枚举
     */
    enum FilterMode
    {
        ShowAll = 0,       ///< 显示全部
        ShowVoltageAlarms, ///< 仅显示电压报警
        ShowCurrentAlarms, ///< 仅显示电流报警
        ShowOfflineAlarms, ///< 仅显示离线报警
        ShowByMeter        ///< 按电表过滤
    };
    Q_ENUM(FilterMode)

    explicit AlarmModel(AlarmEngine *alarmEngine, QObject *parent = nullptr);
    ~AlarmModel();

    // QAbstractListModel 接口实现
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;

    /**
     * @brief 获取过滤模式
     */
    FilterMode filterMode() const { return m_filterMode; }

    /**
     * @brief 设置过滤模式
     */
    void setFilterMode(FilterMode mode);

    /**
     * @brief 是否仅显示激活的报警
     */
    bool showActiveOnly() const { return m_showActiveOnly; }

    /**
     * @brief 设置是否仅显示激活的报警
     */
    void setShowActiveOnly(bool activeOnly);

    /**
     * @brief 设置按电表过滤的电表ID
     */
    Q_INVOKABLE void setFilterMeterId(int meterId);

    /**
     * @brief 刷新模型数据（从数据库重新加载）
     */
    Q_INVOKABLE void refresh();

    /**
     * @brief 确认报警
     * @param index 索引
     */
    Q_INVOKABLE bool acknowledgeAlarmAt(int index);

    /**
     * @brief 批量确认所有未确认的报警
     */
    Q_INVOKABLE void acknowledgeAllAlarms();

    /**
     * @brief 获取指定索引的报警事件
     * @param index 索引
     */
    Q_INVOKABLE QVariantMap getAlarmAt(int index) const;

    /**
     * @brief 查询历史报警记录（支持时间范围和分页）
     * @param meterId 电表ID（-1表示所有电表）
     * @param startTime 开始时间（ISO格式字符串）
     * @param endTime 结束时间（ISO格式字符串）
     * @param acknowledgedFilter 确认状态过滤（-1=全部, 0=未确认, 1=已确认）
     * @param offset 分页偏移量
     * @param limit 每页数量
     */
    Q_INVOKABLE void queryHistoryAlarms(int meterId,
                                        const QString &startTime,
                                        const QString &endTime,
                                        int acknowledgedFilter = -1,
                                        int offset = 0,
                                        int limit = 50);

    /**
     * @brief 获取报警统计信息
     * @return QVariantMap包含: totalCount, unacknowledgedCount, voltageCount, currentCount, offlineCount
     */
    Q_INVOKABLE QVariantMap getStatistics() const;

    /**
     * @brief 导出报警记录为CSV
     * @param meterId 电表ID（-1表示所有电表）
     * @param startTime 开始时间（ISO格式字符串）
     * @param endTime 结束时间（ISO格式字符串）
     * @param filePath 导出文件路径
     * @return 是否导出成功
     */
    Q_INVOKABLE bool exportToCSV(int meterId,
                                 const QString &startTime,
                                 const QString &endTime,
                                 const QString &filePath);

    /**
     * @brief 批量确认选中的报警
     * @param alarmIds 报警ID数组
     * @return 成功确认的数量
     */
    Q_INVOKABLE int batchAcknowledgeByIds(const QVariantList &alarmIds);

signals:
    /**
     * @brief 数量改变信号
     */
    void countChanged();

    /**
     * @brief 过滤模式改变信号
     */
    void filterModeChanged();

    /**
     * @brief 仅显示激活报警改变信号
     */
    void showActiveOnlyChanged();

private slots:
    /**
     * @brief 处理报警触发
     */
    void onAlarmTriggered(const AlarmEvent &event);

    /**
     * @brief 处理报警恢复
     */
    void onAlarmRecovered(int meterId, AlarmType type);

private:
    /**
     * @brief 更新过滤后的报警列表
     */
    void updateFilteredAlarms();

    /**
     * @brief 检查报警是否符合过滤条件
     */
    bool matchFilter(const AlarmEvent &event) const;

    /**
     * @brief 将报警事件转换为QVariantMap
     */
    QVariantMap alarmEventToVariantMap(const AlarmEvent &event) const;

    /**
     * @brief 从报警类型名称字符串解析为AlarmType枚举
     */
    AlarmType parseAlarmType(const QString &typeName) const;

    AlarmEngine *m_alarmEngine;           ///< 报警引擎
    QVector<AlarmEvent> m_filteredAlarms; ///< 过滤后的报警列表
    FilterMode m_filterMode;              ///< 过滤模式
    bool m_showActiveOnly;                ///< 是否仅显示激活的报警
    int m_filterMeterId;                  ///< 过滤电表ID（用于ShowByMeter模式）
};

#endif // ALARMMODEL_H
